from multiprocessing import Process,Queue
from time import sleep
def download(q):                           #向公共的队列q中存入值
    # 模拟下载文件的操作
    images=['girl.jpg','boy.jpg','man.jpg']
    for image in images:
        print("{}正在下载".format(image))
        sleep(0.5)
        q.put(image)
def getfile(q):                             #在公共队列q中取值
    # 模拟下载完成的操作
    while True:                         #循环取值
        try:
            """
            q.get(timeout=5)和get_nowait()一个是阻塞但是等待五秒，5秒取不到抛出异常结束进程；另一个是不等待，直接取完，然后抛出异常
            """
            file=q.get(timeout=5)
            print("{}保存成功".format(file))
        #     file=q.get_nowait()
        #     print("{}保存成功".format(file))
        except:
            """
            不做异常处理会发生取空的情况，取空之后就会抛出异常
            """
            print("循环取值结束")
            break
if __name__=="__main__":
    q=Queue(5)                          # 定义一个公共队列
    p1=Process(target=download,args=(q,))
    """
    target传值的时候会出现的情况：
    1、download：没有括号表示调用的是方法
    2、download()：有括号表示调用的是方法值执行结果
    """
    p2 = Process(target=getfile,args=(q,))
    p1.start()
    p1.join()
    """"
    不加p1.join()会导致取的动作不会等待，即放入后就开始取
    """
    p2.start()
    p2.join()
    """
    不加p2.join()会导致进程直接结束
    """
    print('00000000000000000')